﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using LiveTissWCF.Data;
using LiveTissWCF.TreeView;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using Microsoft.WindowsAzure.ServiceRuntime;
using System.IO;

namespace LiveTissWCF
{
    public class LiveTissService : ILiveTissService
    {
        #region Command
        private static string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["AzureConnectionString"].ConnectionString;

        public static SqlCommand InitializeCommand()
        {
            SqlConnection connection = new SqlConnection(connectionString);

            var cmd = new SqlCommand();
            cmd.Connection = connection;

            return cmd;
        }
        #endregion

        #region Login

        public bool ValidateToken(AuthenticationToken token)
        {
            return LiveTissService.Validate(token);
        }

        private static Login _GetByUsernamePassword(string username, string password)
        {
            var Command = InitializeCommand();
            Login login = null;
            try
            {
                Command.Connection.Open();

                Command.CommandText = "SELECT idLogin, Usuario, Senha, Administrador FROM tbLogin WHERE Usuario = '" + username +
                                                                                     "' AND Senha = '" + password + "'";
                Command.CommandType = CommandType.Text;

                var reader = Command.ExecuteReader();

                if (reader.Read())
                {
                    login = new Login()
                    {
                        ID = int.Parse(reader["idLogin"].ToString()),
                        Usuario = reader["Usuario"].ToString(),
                        Senha = reader["Senha"].ToString(),
                        IsAdministrator = Boolean.Parse(reader["Administrador"].ToString())
                    };
                }
                else
                {
                    throw new Exception("Login não encontrado");
                }
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
            return login;
        }

        public static bool Validate(AuthenticationToken token)
        {
            try
            {
                // autentica o token com a base de dados
                string login = Util.Decrypt(token.Login);
                string password = Util.Decrypt(token.Password);

                string passMD5 = Util.CalculateMD5Hash(password);

                LiveTissService._GetByUsernamePassword(login, passMD5);
            }
            catch (Exception err)
            {
                return false;
            }
            return true;
        }

        public Login LoginGetByToken(AuthenticationToken token)
        {
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    // autentica o token com a base de dados
                    string login = Util.Decrypt(token.Login);
                    string password = Util.Decrypt(token.Password);

                    string passMD5 = Util.CalculateMD5Hash(password);
 
                    return LiveTissService._GetByUsernamePassword(login, passMD5);
                }
                catch (Exception)
                {
                    return null;
                }
            }
        }

        public Login LoginGetById(AuthenticationToken token, int id)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                Login login = null;
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "SELECT idLogin, Usuario, Senha,Administrador FROM tbLogin WHERE idLogin=" + id;
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    if (reader.Read())
                    {
                        login = new Login()
                        {
                            ID = int.Parse(reader["idLogin"].ToString()),
                            Usuario = reader["Usuario"].ToString(),
                            Senha = reader["Senha"].ToString(),
                            IsAdministrator = Boolean.Parse(reader["Administrador"].ToString())
                        };
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return login;
            }
        }

        public IEnumerable<Login> LoginGetAll(AuthenticationToken token)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                List<Login> list = new List<Login>();
                try
                {
                    Command.CommandText = "SELECT idLogin, Usuario, Senha, Administrador FROM tbLogin";
                    Command.CommandType = CommandType.Text;

                    Command.Connection.Open();
                    var reader = Command.ExecuteReader();

                    while (reader.Read())
                    {
                        Login login = new Login()
                        {
                            ID = int.Parse(reader["idLogin"].ToString()),
                            Usuario = reader["Usuario"].ToString(),
                            Senha = reader["Senha"].ToString(),
                            IsAdministrator = Boolean.Parse(reader["Administrador"].ToString())
                        };
                        list.Add(login);
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return list.AsQueryable<Login>();
            }
        }

        public int LoginInsert(AuthenticationToken token, Login entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "INSERT INTO tbLogin (idLogin, Usuario, Senha, Administrador) VALUES (" + entity.ID + ",'" + entity.Usuario + "', '" + entity.Senha + "'," + (Convert.ToInt32(entity.IsAdministrator)).ToString() + ")";
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return entity.ID;
            }
        }

        public void LoginDelete(AuthenticationToken token, Login entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "DELETE FROM tbLogin WHERE idLogin=" + entity.ID;
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public void LoginUpdate(AuthenticationToken token, Login entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format("UPDATE tbLogin SET Usuario='{0}',Senha='{1}',Administrador={2}  WHERE idLogin={3}", entity.Usuario, entity.Senha, (Convert.ToInt32(entity.IsAdministrator)).ToString(), entity.ID);
                    //Command.CommandText = "UPDATE tbLogin SET Usuario='" + entity.Usuario + "', Senha='" + entity.Senha + "', Administrador = '' WHERE idLogin=" + entity.ID;
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        #endregion

        #region Prestador
        public Prestador PrestadorGetById(AuthenticationToken token, int id)
        {
            Prestador p = this._PrestadorGetById(token, id);
            p.LoginPrestador = this.LoginGetById(token, p.ID);
            p.ProfissionalPrestador = this.ProfissionalGetById(token, p.ID);
            p.ClinicaPrestador = this.ClinicaGetById(token, p.ID);

            return p;
        }

        public Prestador _PrestadorGetById(AuthenticationToken token, int id)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                Prestador prestador = null;
                try
                {
                    Command.CommandText = "SELECT idPrestador, nome, tipoLogradouro, logradouro, numero, complemento, codigoIBGE, municipio, codigoUF, CEP FROM tbPrestador WHERE idPrestador=" + id;
                    Command.CommandType = CommandType.Text;

                    Command.Connection.Open();
                    var reader = Command.ExecuteReader();

                    if (reader.Read())
                    {
                        prestador = new Prestador()
                        {
                            ID = int.Parse(reader["idPrestador"].ToString()),
                            Nome = reader["nome"].ToString(),
                            TipoLogradouro = reader["tipoLogradouro"].ToString(),
                            Logradouro = reader["logradouro"].ToString(),
                            Numero = reader["numero"].ToString(),
                            Complemento = reader["complemento"].ToString(),
                            CodigoIBGE = reader["codigoIBGE"].ToString(),
                            Municipio = reader["municipio"].ToString(),
                            CodigoUF = reader["codigoUF"].ToString(),
                            CEP = reader["CEP"].ToString()
                        };
                    }
                    else
                    {
                        throw new Exception("Prestador não encontrado");
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return prestador;
            }
        }

        public IEnumerable<Prestador> PrestadorGetAll(AuthenticationToken token)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                List<Prestador> list = new List<Prestador>();
                try
                {
                    Command.CommandText = "SELECT idPrestador, nome, tipoLogradouro, logradouro, numero, complemento, codigoIBGE, municipio, codigoUF, CEP FROM tbPrestador";
                    Command.CommandType = CommandType.Text;

                    Command.Connection.Open();
                    var reader = Command.ExecuteReader();

                    while (reader.Read())
                    {
                        Prestador prestador = new Prestador()
                        {
                            ID = int.Parse(reader["idPrestador"].ToString()),
                            Nome = reader["nome"].ToString(),
                            TipoLogradouro = reader["tipoLogradouro"].ToString(),
                            Logradouro = reader["logradouro"].ToString(),
                            Numero = reader["numero"].ToString(),
                            Complemento = reader["complemento"].ToString(),
                            CodigoIBGE = reader["codigoIBGE"].ToString(),
                            Municipio = reader["municipio"].ToString(),
                            CodigoUF = reader["codigoUF"].ToString(),
                            CEP = reader["CEP"].ToString()
                        };
                        list.Add(prestador);
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }

                string login = Util.Decrypt(token.Login);
                string password = Util.Decrypt(token.Password);

                string passMD5 = Util.CalculateMD5Hash(password);

                foreach (Prestador prestador in list.GetRange(0, list.Count))
                {
                    prestador.LoginPrestador = this.LoginGetById(token, prestador.ID);

                    if (!prestador.LoginPrestador.Usuario.Equals(login) ||
                        !prestador.LoginPrestador.Senha.Equals(passMD5))
                    {
                        prestador.ProfissionalPrestador = this.ProfissionalGetById(token, prestador.ID);
                        prestador.ClinicaPrestador = this.ClinicaGetById(token, prestador.ID);
                    }
                    else
                    {
                        list.Remove(prestador);
                    }
                }

                return list;
            }
        }

        public int PrestadorInsert(AuthenticationToken token, Prestador entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                int id = -1;
                try
                {
                    Command.CommandType = CommandType.Text;
                    Command.CommandText = string.Format(
                        "INSERT INTO tbPrestador (nome, tipoLogradouro, logradouro, numero, complemento, codigoIBGE, municipio, codigoUF, CEP)" +
                        " VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}', '{8}');" +
                        "SELECT @@IDENTITY;", 
                        entity.Nome, entity.TipoLogradouro, entity.Logradouro, entity.Numero, entity.Complemento, entity.CodigoIBGE, entity.Municipio, 
                        entity.CodigoUF, entity.CEP);

                    Command.Connection.Open();

                    id = int.Parse(Command.ExecuteScalar().ToString());

                    Command.CommandText = string.Empty;
                    if (entity.LoginPrestador != null)
                    {
                        entity.LoginPrestador.Senha = Util.CalculateMD5Hash(entity.LoginPrestador.SenhaNova);

                        Command.CommandText += string.Format(
                            "INSERT INTO tbLogin (idLogin, Usuario, Senha, Administrador)" +
                            " VALUES ({0}, '{1}', '{2}', '{3}');",
                            id, entity.LoginPrestador.Usuario, entity.LoginPrestador.Senha, 
                            entity.LoginPrestador.IsAdministrator);
                    }
                    if (entity.ProfissionalPrestador != null)
                    {
                        Command.CommandText += string.Format(
                            "INSERT INTO tbProfissional (idPrestador, siglaConselho, numeroConselho, ufConselho, CPF, CBOS)" +
                            " VALUES ({0}, '{1}', '{2}', '{3}', '{4}', '{5}', {6});",
                            id, entity.ProfissionalPrestador.SiglaConselho, entity.ProfissionalPrestador.NumeroConselho,
                            entity.ProfissionalPrestador.UFConselho, entity.ProfissionalPrestador.CPF,
                            entity.ProfissionalPrestador.CBOS, entity.ProfissionalPrestador.Judiciario);
                    }
                    if (entity.ClinicaPrestador != null)
                    {
                        Command.CommandText += string.Format(
                            "INSERT INTO tbClinicaHospital (idPrestador, CNES, CNPJ)" +
                            " VALUES ({0}, '{1}', '{2}');",
                            id, entity.ClinicaPrestador.CNES, entity.ClinicaPrestador.CNPJ);
                    }
                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }


                return id;
            }
        }

        public void PrestadorDelete(AuthenticationToken token, Prestador entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "DELETE FROM tbLogin WHERE idLogin={0};" +
                        "DELETE FROM tbProfissional WHERE idPrestador={0};" +
                        "DELETE FROM tbClinicaHospital WHERE idPrestador={0};" +
                        "DELETE FROM tbPrestador WHERE idPrestador={0};",
                        entity.ID);
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public void PrestadorUpdate(AuthenticationToken token, Prestador entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.CommandText = string.Format("UPDATE tbPrestador SET nome='{0}', tipoLogradouro='{1}', logradouro='{2}'," +
                        " numero='{3}', complemento='{4}', codigoIBGE='{5}', municipio='{6}', codigoUF='{7}', CEP='{8}'" +
                        " WHERE idPrestador={9};", entity.Nome, entity.TipoLogradouro, entity.Logradouro, entity.Numero,
                        entity.Complemento, entity.CodigoIBGE, entity.Municipio, entity.CodigoUF, entity.CEP, entity.ID);

                    if (!string.IsNullOrEmpty(entity.LoginPrestador.SenhaNova))
                    {
                        entity.LoginPrestador.Senha = Util.CalculateMD5Hash(entity.LoginPrestador.SenhaNova);
                    }

                    Command.CommandText += string.Format("UPDATE tbLogin SET usuario='{0}', senha='{1}', administrador='{2}'" +
                        " WHERE idLogin={3};", entity.LoginPrestador.Usuario, entity.LoginPrestador.Senha, entity.LoginPrestador.IsAdministrator,
                        entity.LoginPrestador.ID);

                    if (entity.ProfissionalPrestador != null)
                    {
                        Command.CommandText += string.Format("UPDATE tbProfissional SET siglaConselho='{0}', numeroConselho='{1}', ufConselho='{2}'," +
                            " CPF='{3}', CBOS='{4}' WHERE idPrestador={5};", entity.ProfissionalPrestador.SiglaConselho, entity.ProfissionalPrestador.NumeroConselho,
                            entity.ProfissionalPrestador.UFConselho, entity.ProfissionalPrestador.CPF, entity.ProfissionalPrestador.CBOS, entity.ProfissionalPrestador.ID);
                    }
                    if (entity.ClinicaPrestador != null)
                    {
                        Command.CommandText += string.Format("UPDATE tbClinicaHospital SET CNES='{0}', CNPJ='{1}'" +
                            " WHERE idPrestador={2};", entity.ClinicaPrestador.CNES, entity.ClinicaPrestador.CNPJ,
                            entity.ClinicaPrestador.ID);
                    }

                    Command.CommandType = CommandType.Text;

                    Command.Connection.Open();

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        #endregion

        #region Operadora

        public Operadora OperadoraGetById(AuthenticationToken token, string registro)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    registro = registro.Replace("-", "");

                    Command.CommandText = "SELECT registroANS,nome,logo FROM tbOperadora WHERE registroANS='" + registro + "'";
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    if (reader.Read())
                    {
                        Operadora operadora = new Operadora();
                        operadora.Nome = reader["nome"].ToString();
                        operadora.RegistroANS = reader["registroANS"].ToString();
                        operadora.Logo = reader["logo"] != DBNull.Value ? (byte[])reader["logo"] : new byte[] { };
                        return operadora;
                    }
                    else
                    {
                        // throw new Exception("Operadora não encontrada");
                        return null;
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public IEnumerable<Operadora> OperadoraGetAll(AuthenticationToken token)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "SELECT registroANS,nome,logo FROM tbOperadora";
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    List<Operadora> list = new List<Operadora>();
                    while (reader.Read())
                    {
                        Operadora operadora = new Operadora();
                        operadora.Nome = reader["nome"].ToString();
                        operadora.RegistroANS = reader["registroANS"].ToString();
                        operadora.Logo = reader["logo"] != DBNull.Value ? (byte[])reader["logo"] : new byte[] { };

                        list.Add(operadora);
                    }
                    return list;
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public int OperadoraInsert(AuthenticationToken token, Operadora entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.Parameters.Clear();

                    entity.RegistroANS = entity.RegistroANS.Replace("-", "");

                    if (entity.Logo != null)
                    {
                        Command.CommandText = string.Format("INSERT INTO tbOperadora (registroANS, nome, logo) VALUES ('{0}','{1}',@logo)", entity.RegistroANS, entity.Nome);

                        SqlParameter parameterLogo = new SqlParameter();
                        parameterLogo.ParameterName = "@logo";
                        parameterLogo.Value = entity.Logo;
                        Command.Parameters.Add(parameterLogo);
                    }
                    else
                    {
                        Command.CommandText = string.Format("INSERT INTO tbOperadora (registroANS, nome) VALUES ('{0}','{1}')", entity.RegistroANS, entity.Nome);
                    }
                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Parameters.Clear();
                    Command.Connection.Close();
                }
                return 0;
            }
        }

        public void OperadoraDelete(AuthenticationToken token, Operadora entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    entity.RegistroANS = entity.RegistroANS.Replace("-", "");

                    Command.CommandText = "DELETE FROM tbOperadora WHERE registroANS=" + entity.RegistroANS;
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public void OperadoraUpdate(AuthenticationToken token, Operadora entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    entity.RegistroANS = entity.RegistroANS.Replace("-", "");

                    Command.CommandText = string.Format("UPDATE tbOperadora SET nome='{0}',logo=@logo WHERE registroANS='{1}'", entity.Nome, entity.RegistroANS);
                    Command.CommandType = CommandType.Text;

                    Command.Parameters.Clear();

                    SqlParameter parameterLogo = new SqlParameter();
                    parameterLogo.ParameterName = "@logo";
                    parameterLogo.Value = entity.Logo;
                    Command.Parameters.Add(parameterLogo);

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Parameters.Clear();
                    Command.Connection.Close();
                }
            }
        }

        public IEnumerable<Operadora> OperadoraGetAllFiliado(AuthenticationToken token)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                var login = LoginGetByToken(token);

                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "SELECT op.registroANS, op.nome, op.logo FROM tbOperadora as op" +
                        " INNER JOIN tbOperadoraPrestador as opp ON opp.idPrestador={0} AND opp.registroANS=op.registroANS;",
                        login.ID);

                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    List<Operadora> list = new List<Operadora>();
                    while (reader.Read())
                    {
                        Operadora operadora = new Operadora();
                        operadora.Nome = reader["nome"].ToString();
                        operadora.RegistroANS = reader["registroANS"].ToString();
                        operadora.Logo = reader["logo"] != DBNull.Value ? (byte[])reader["logo"] : new byte[] { };

                        list.Add(operadora);
                    }
                    return list;
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public IEnumerable<Operadora> OperadoraGetAllNaoFiliado(AuthenticationToken token)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                var login = LoginGetByToken(token);

                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "SELECT op1.registroANS, op1.nome, op1.logo FROM tbOperadora as op1" +
                        " WHERE NOT EXISTS (" +
                        "SELECT op2.registroANS FROM tbOperadora as op2" +
                        " INNER JOIN tbOperadoraPrestador as opp ON opp.idPrestador={0} AND opp.registroANS=op2.registroANS" +
                        " WHERE op1.registroANS=op2.registroANS" +
                        " );",
                        login.ID);

                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    List<Operadora> list = new List<Operadora>();
                    while (reader.Read())
                    {
                        Operadora operadora = new Operadora();
                        operadora.Nome = reader["nome"].ToString();
                        operadora.RegistroANS = reader["registroANS"].ToString();
                        operadora.Logo = reader["logo"] != DBNull.Value ? (byte[])reader["logo"] : new byte[] { };

                        list.Add(operadora);
                    }
                    return list;
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        #endregion

        #region OperadoraPrestador

        public OperadoraPrestador OperadoraPrestadorGetById(AuthenticationToken token, string registroANS, int prestador_id)
        {
            var Command = InitializeCommand();
            try
            {
                if (!Validate(token))
                {
                    throw new Exception("Erro: falha na autenticação.");
                }
                else
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "SELECT idOperadoraPrestador, idPrestador, registroANS, codigoNaOperadora" +
                        " FROM tbOperadoraPrestador WHERE idPrestador={0} AND registroANS='{1}'",
                        prestador_id, registroANS
                    );

                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    if (reader.Read())
                    {
                        OperadoraPrestador operadoraPrestador = new OperadoraPrestador()
                        {
                            ID = int.Parse(reader["idOperadoraPrestador"].ToString()),
                            IDPrestador = int.Parse(reader["idPrestador"].ToString()),
                            RegistroANS = reader["registroANS"].ToString(),
                            CodigoNaOperadora = reader["codigoNaOperadora"].ToString()
                        };
                        return operadoraPrestador;
                    }
                    else
                    {
                        throw new Exception("OperadoraPrestador não encontrado");
                    }
                } 
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao executar operação: " + e.Message);
            }
            finally
            {
                Command.Connection.Close();
            }
        }

        public IEnumerable<OperadoraPrestador> OperadoraPrestadorGetAll(AuthenticationToken token)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "SELECT idOperadoraPrestador, idPrestador, registroANS, codigoNaOperadora FROM tbOperadoraPrestador";
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    List<OperadoraPrestador> list = new List<OperadoraPrestador>();
                    while (reader.Read())
                    {
                        OperadoraPrestador operadoraPrestador = new OperadoraPrestador()
                        {
                            ID = int.Parse(reader["idOperadoraPrestador"].ToString()),
                            IDPrestador = int.Parse(reader["idPrestador"].ToString()),
                            RegistroANS = reader["registroANS"].ToString(),
                            CodigoNaOperadora = reader["codigoNaOperadora"].ToString()
                        };
                        list.Add(operadoraPrestador);
                    }
                    return list.AsQueryable<OperadoraPrestador>();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public int OperadoraPrestadorInsert(AuthenticationToken token,OperadoraPrestador entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "INSERT INTO tbOperadoraPrestador (idPrestador, registroANS, codigoNaOperadora)" +
                        " VALUES ({0}, '{1}', '{2}'); SELECT @@IDENTITY;",
                        entity.IDPrestador, entity.RegistroANS, entity.CodigoNaOperadora
                    );
                    Command.CommandType = CommandType.Text;

                    return int.Parse(Command.ExecuteScalar().ToString());
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public void OperadoraPrestadorDelete(AuthenticationToken token, OperadoraPrestador entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "DELETE FROM tbOperadoraPrestador WHERE idOperadoraPrestador=" + entity.ID;
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            } 
        }

        public void OperadoraPrestadorUpdate(AuthenticationToken token, OperadoraPrestador entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "UPDATE tbOperadoraPrestador SET idPrestador={0}, registroANS='{1}', codigoNaOperadora='{2}'" +
                        "WHERE idOperadoraPrestador={3}",
                        entity.IDPrestador, entity.RegistroANS, entity.CodigoNaOperadora, entity.ID
                    );
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        #endregion

        #region Clinica Hospital

        /// <summary>
        /// Retorna uma clinica/hospital baseado em seu identificador
        /// </summary>
        /// <param name="id">identificador</param>
        /// <returns></returns>
        public ClinicaHospital ClinicaGetById(AuthenticationToken token, int id)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                ClinicaHospital clinicaHospital = null;
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "SELECT idPrestador,CNES,CNPJ FROM tbClinicaHospital WHERE idPrestador=" + id;
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    if (reader.Read())
                    {
                        clinicaHospital = new ClinicaHospital();
                        clinicaHospital.ID = int.Parse(reader["idPrestador"].ToString());
                        clinicaHospital.CNPJ = reader["CNPJ"].ToString();
                        clinicaHospital.CNES = reader["CNES"].ToString();
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return clinicaHospital;
            }
        }

        /// <summary>
        /// Retorna todos os registros de clinicas e hospitais existentes
        /// </summary>
        /// <returns></returns>
        public IEnumerable<ClinicaHospital> ClinicaGetAll(AuthenticationToken token)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                List<ClinicaHospital> list = new List<ClinicaHospital>();
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "SELECT idPrestador,CNES,CNPJ FROM tbClinicaHospital";
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    while (reader.Read())
                    {
                        ClinicaHospital clinicaHospital = new ClinicaHospital();
                        clinicaHospital.ID = int.Parse(reader["idPrestador"].ToString());
                        clinicaHospital.CNPJ = reader["CNPJ"].ToString();
                        clinicaHospital.CNES = reader["CNES"].ToString();
                        list.Add(clinicaHospital);
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return list.AsQueryable<ClinicaHospital>();
            }
        }

        /// <summary>
        /// Insere uma nova clinica/hospital no banco de dados
        /// </summary>
        /// <param name="entity"></param>
        public int ClinicaInsert(AuthenticationToken token, ClinicaHospital entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "INSERT INTO tbClinicaHospital (idPrestador, CNPJ, CNES) VALUES (" + entity.ID + ",'" + entity.CNPJ + "', '" + entity.CNES + "')";
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return entity.ID;
            }
        }

        /// <summary>
        /// Remove uma clinica do banco de dados
        /// </summary>
        /// <param name="entity">Entidade a ser removida</param>
        public void ClinicaDelete(AuthenticationToken token, ClinicaHospital entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "DELETE FROM tbClinicaHospital WHERE idPrestador=" + entity.ID;
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        /// <summary>
        /// Atualiza uma clinica/hospital existente no banco
        /// </summary>
        /// <param name="entity">Entidade a ser realizada</param>
        public void ClinicaUpdate(AuthenticationToken token, ClinicaHospital entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "UPDATE tbClinicaHospital SET CNPJ='" + entity.CNPJ + "', CNES='" + entity.CNES + "' WHERE idPrestador=" + entity.ID;
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        #endregion

        #region Profissional

        public Profissional ProfissionalGetById(AuthenticationToken token, int id)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                Profissional profissional = null;
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "SELECT idPrestador, siglaConselho, numeroConselho, ufConselho, CPF, CBOS, judiciario FROM tbProfissional WHERE idPrestador=" + id;
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    if (reader.Read())
                    {
                        profissional = new Profissional()
                        {
                            ID = int.Parse(reader["idPrestador"].ToString()),
                            SiglaConselho = reader["siglaConselho"].ToString(),
                            NumeroConselho = reader["numeroConselho"].ToString(),
                            UFConselho = reader["ufConselho"].ToString(),
                            CPF = reader["CPF"].ToString(),
                            CBOS = reader["CBOS"].ToString(),
                            Judiciario = int.Parse(reader["judiciario"].ToString())
                        };
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return profissional;
            }
        }

        public IEnumerable<Profissional> ProfissionalGetAll(AuthenticationToken token)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                List<Profissional> list = new List<Profissional>();
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "SELECT idPrestador, siglaConselho, numeroConselho, ufConselho, CPF, CBOS, judiciario FROM tbProfissional";
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    while (reader.Read())
                    {
                        Profissional profissional = new Profissional()
                        {
                            ID = int.Parse(reader["idPrestador"].ToString()),
                            SiglaConselho = reader["siglaConselho"].ToString(),
                            NumeroConselho = reader["numeroConselho"].ToString(),
                            UFConselho = reader["ufConselho"].ToString(),
                            CPF = reader["CPF"].ToString(),
                            CBOS = reader["CBOS"].ToString(),
                            Judiciario = int.Parse(reader["judiciario"].ToString())
                        };
                        list.Add(profissional);
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return list.AsEnumerable<Profissional>();
            }
        }

        public int ProfissionalInsert(AuthenticationToken token, Profissional entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format("INSERT INTO tbProfissional (idPrestador, siglaConselho, numeroConselho, ufConselho, CPF, CBOS, judiciario) VALUES " +
                                                        "({0},'{1}','{2}','{3}','{4}','{5}',{6})", entity.ID, entity.SiglaConselho, entity.NumeroConselho, entity.UFConselho, entity.CPF, entity.CBOS, entity.Judiciario);

                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return entity.ID;
            }
        }

        public void ProfissionalDelete(AuthenticationToken token, Profissional entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "DELETE FROM tbProfissional WHERE idPrestador=" + entity.ID;
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public void ProfissionalUpdate(AuthenticationToken token, Profissional entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "UPDATE tbProfissional SET siglaConselho='" + entity.SiglaConselho + "', numeroConselho='" + entity.NumeroConselho +
                        "', ufConselho='" + entity.UFConselho + "', CPF='" + entity.CPF + "', CBOS='" + entity.CBOS + "', judiciario=" + entity.Judiciario +
                        " WHERE idPrestador=" + entity.ID;
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        #endregion

        #region IntervaloLote

        public IEnumerable<IntervaloLote> IntervaloLoteGetAllByOperadoraPrestador(AuthenticationToken token, int idOperadoraPrestador)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                List<IntervaloLote> list = new List<IntervaloLote>();
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "SELECT idIntervaloLote, idOperadoraPrestador, inicio, fim, atual FROM tbIntervaloLote" +
                        " WHERE idOperadoraPrestador={0}",
                        idOperadoraPrestador
                    );
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    while (reader.Read())
                    {
                        IntervaloLote item = new IntervaloLote()
                        {
                            ID = int.Parse(reader["idIntervaloLote"].ToString()),
                            IDOperadoraPrestador = int.Parse(reader["idOperadoraPrestador"].ToString()),
                            Inicio = int.Parse(reader["inicio"].ToString()),
                            Fim = int.Parse(reader["fim"].ToString()),
                            Atual = int.Parse(reader["atual"].ToString())
                        };

                        list.Add(item);
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return list;
            }
        }

        public IEnumerable<IntervaloLote> IntervaloLoteGetByRegistroANS(AuthenticationToken token, string registroANS)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                var login = LoginGetByToken(token);

                List<IntervaloLote> list = new List<IntervaloLote>();
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "SELECT il.idIntervaloLote, il.idOperadoraPrestador, il.inicio, il.fim, il.atual" +
                        " FROM tbIntervaloLote as il" +
                        " INNER JOIN tbOperadoraPrestador as op ON il.idOperadoraPrestador=op.idOperadoraPrestador" +
                        " WHERE op.idPrestador={0} AND op.registroANS='{1}'", 
                        login.ID, registroANS
                    );
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    while (reader.Read())
                    {
                        IntervaloLote item = new IntervaloLote()
                        {
                            ID = int.Parse(reader["idIntervaloLote"].ToString()),
                            IDOperadoraPrestador = int.Parse(reader["idOperadoraPrestador"].ToString()),
                            Inicio = int.Parse(reader["inicio"].ToString()),
                            Fim = int.Parse(reader["fim"].ToString()),
                            Atual = int.Parse(reader["atual"].ToString())
                        };

                        list.Add(item);
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return list;
            }
        }

        public int IntervaloLoteInsert(AuthenticationToken token, IntervaloLote entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                int id = 0;
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "INSERT INTO tbIntervaloLote (idOperadoraPrestador, inicio, fim, atual)" +
                        " VALUES ({0}, {1}, {2}, {3});" +
                        "SELECT @@IDENTITY;", 
                        entity.IDOperadoraPrestador, entity.Inicio, entity.Fim, entity.Atual
                    );

                    Command.CommandType = CommandType.Text;

                    id = int.Parse(Command.ExecuteScalar().ToString());
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
                return id;
            }
        }

        public void IntervaloLoteDelete(AuthenticationToken token, IntervaloLote entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "DELETE FROM tbIntervaloLote WHERE idIntervaloLote={0}",
                        entity.ID
                    );

                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public void IntervaloLoteUpdate(AuthenticationToken token, IntervaloLote entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "UPDATE tbIntervaloLote SET idOperadoraPrestador={0}, inicio={1}," +
                        " fim={2}, atual={3} WHERE idIntervaloLote={4}",
                        entity.IDOperadoraPrestador, entity.Inicio, entity.Fim, entity.Atual, entity.ID
                    );

                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        #endregion

        #region LoteGuia

        public LoteGuia LoteGuiaGetById(AuthenticationToken token, int id)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {

                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "SELECT idLoteGuia, numeroLote, idTipoGuia, idOperadoraPrestador FROM tbLoteGuia WHERE idLoteGuia=" + id;
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    if (reader.Read())
                    {
                        LoteGuia loteGuia = new LoteGuia()
                        {
                            ID = int.Parse(reader["idLoteGuia"].ToString()),
                            NumeroLote = reader["numeroLote"].ToString(),
                            TipoGuia = ((TipoGuia)(Convert.ToInt32(reader["idTipoGuia"]))),
                            IDOperadoraPrestador = int.Parse(reader["idOperadoraPrestador"].ToString())
                        };
                        return loteGuia;
                    }
                    else
                    {
                        throw new Exception("LoteGuia não encontrado");
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public IEnumerable<LoteGuia> LoteGuiaGetAll(AuthenticationToken token)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {

                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "SELECT idLoteGuia, numeroLote, idTipoGuia, idOperadoraPrestador FROM tbLoteGuia";
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    List<LoteGuia> list = new List<LoteGuia>();
                    while (reader.Read())
                    {
                        LoteGuia loteGuia = new LoteGuia()
                        {
                            ID = int.Parse(reader["idLoteGuia"].ToString()),
                            NumeroLote = reader["numeroLote"].ToString(),
                            TipoGuia = (TipoGuia)int.Parse(reader["idTipoGuia"].ToString()),
                            IDOperadoraPrestador = int.Parse(reader["idOperadoraPrestador"].ToString())
                        };
                        list.Add(loteGuia);
                    }
                    return list;
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public int LoteGuiaInsert(AuthenticationToken token, LoteGuia entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "INSERT INTO tbLoteGuia (numeroLote, idTipoGuia, idOperadoraPrestador) VALUES ('" +
                        entity.NumeroLote + "'," + (int)entity.TipoGuia + "," + entity.IDOperadoraPrestador + ")";
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();

                    Command.CommandText = "SELECT @@IDENTITY";

                    return int.Parse(Command.ExecuteScalar().ToString());
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public void LoteGuiaDelete(AuthenticationToken token, LoteGuia entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {

                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "DELETE FROM tbLoteGuia WHERE idLoteGuia=" + entity.ID;
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public void LoteGuiaUpdate(AuthenticationToken token, LoteGuia entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "UPDATE tbLoteGuia SET numeroLote='" + entity.NumeroLote + "', idTipoGuia=" + (int)entity.TipoGuia +
                        ", idOperadoraPrestador=" + entity.IDOperadoraPrestador + "' WHERE idLoteGuia=" + entity.ID;
                    Command.CommandType = CommandType.Text;

                    Command.ExecuteNonQuery();
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        #endregion

        #region GuiaSolicitacao

        public IEnumerable<GuiaSolicitacao> GuiaSolicitacaoGetAll(AuthenticationToken token,
            string registroANS, int prestador_id)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "SELECT gs.numeroGuia, gs.idTipoGuia, gs.idOperadoraPrestador, gs.dataEmissao, gs.idBlobGuia" +
                        " FROM tbGuiaSolicitacao as gs" +
                        " INNER JOIN tbOperadoraPrestador as op ON op.idOperadoraPrestador = gs.idOperadoraPrestador" +
                        " WHERE op.registroANS={0} AND op.idPrestador={1}",
                        registroANS, prestador_id
                    );
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    List<GuiaSolicitacao> list = new List<GuiaSolicitacao>();
                    while (reader.Read())
                    {
                        GuiaSolicitacao guia = new GuiaSolicitacao()
                        {
                            NumeroGuia = reader["numeroGuia"].ToString(),
                            TipoGuia = int.Parse(reader["idTipoGuia"].ToString()),
                            OperadoraPrestador = int.Parse(reader["idOperadoraPrestador"].ToString()),
                            DataEmissao = DateTime.Parse(reader["dataEmissao"].ToString()),
                            BlobGuia = reader["idBlobGuia"] != DBNull.Value ? int.Parse(reader["idBlobGuia"].ToString()) : -1
                        };
                        list.Add(guia);
                    }
                    return list;
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public IEnumerable<GuiaSolicitacao> GuiaSolicitacaoGetAllByTipoGuia(AuthenticationToken token,
            string registroANS, int prestador_id, TipoGuia tipo)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "SELECT gs.numeroGuia, gs.idTipoGuia, gs.idOperadoraPrestador, gs.dataEmissao, gs.idBlobGuia" +
                        " FROM tbGuiaSolicitacao as gs" +
                        " INNER JOIN tbOperadoraPrestador as op ON op.idOperadoraPrestador = gs.idOperadoraPrestador" +
                        " WHERE op.registroANS={0} AND op.idPrestador={1} AND gs.idTipoGuia={2}",
                        registroANS, prestador_id, (int)tipo
                    );
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    List<GuiaSolicitacao> list = new List<GuiaSolicitacao>();
                    while (reader.Read())
                    {
                        GuiaSolicitacao guia = new GuiaSolicitacao()
                        {
                            NumeroGuia = reader["numeroGuia"].ToString(),
                            TipoGuia = int.Parse(reader["idTipoGuia"].ToString()),
                            OperadoraPrestador = int.Parse(reader["idOperadoraPrestador"].ToString()),
                            DataEmissao = DateTime.Parse(reader["dataEmissao"].ToString()),
                            BlobGuia = reader["idBlobGuia"] != DBNull.Value ? int.Parse(reader["idBlobGuia"].ToString()) : -1
                        };
                        list.Add(guia);
                    }
                    return list;
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public bool GuiaSolicitacaoInsert(AuthenticationToken token, GuiaSolicitacao entity, string registroANS)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                var login = LoginGetByToken(token);
                var guias = GuiaSolicitacaoGetAll(token, registroANS, login.ID);

                if (!guias.Any(guia => guia.NumeroGuia.Equals(entity.NumeroGuia)))
                {
                    var op = OperadoraPrestadorGetById(token, registroANS, login.ID);
                
                    try
                    {
                        Command.Connection.Open();

                        Command.CommandText = string.Format(
                            "INSERT INTO tbGuiaSolicitacao (numeroGuia, idTipoGuia, idOperadoraPrestador)" +
                            " VALUES ('{0}', {1}, {2});",
                            entity.NumeroGuia, entity.TipoGuia, op.ID
                        );
                        Command.CommandType = CommandType.Text;

                        Command.ExecuteNonQuery();

                        return true;
                    }
                    catch (Exception e)
                    {
                        throw new Exception("Erro ao executar operação: " + e.Message);
                    }
                    finally
                    {
                        Command.Connection.Close();
                    }
                }
            }
            return false;
        }

        #endregion

        #region GuiaFaturamento

        public IEnumerable<GuiaFaturamento> GuiaFaturamentoGetAllByLote(AuthenticationToken token,
            int lote_id)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "SELECT gf.numeroGuia, gf.idLoteGuia, gf.dataEmissao, gf.glosa, gf.reapresentada, gf.idBlobGuia" +
                        " FROM tbGuiaFaturamento as gf" +
                        " WHERE gf.idLoteGuia={0}",
                        lote_id
                    );
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    List<GuiaFaturamento> list = new List<GuiaFaturamento>();
                    while (reader.Read())
                    {
                        GuiaFaturamento guia = new GuiaFaturamento()
                        {
                            NumeroGuia = reader["numeroGuia"].ToString(),
                            LoteGuia = int.Parse(reader["idLoteGuia"].ToString()),
                            Glosa = reader["glosa"] != DBNull.Value ? Convert.ToBoolean(reader["glosa"].ToString()) : false,
                            Reapresentada = reader["reapresentada"] != DBNull.Value ? Convert.ToBoolean(reader["reapresentada"].ToString()) : false,
                            DataEmissao = DateTime.Parse(reader["dataEmissao"].ToString()),
                            BlobGuia = reader["idBlobGuia"] != DBNull.Value ? int.Parse(reader["idBlobGuia"].ToString()) : -1
                        };
                        list.Add(guia);
                    }
                    return list;
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        public bool GuiaFaturamentoInsert(AuthenticationToken token,GuiaFaturamento entity)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                var guias = GuiaFaturamentoGetAllByLote(token, entity.LoteGuia);

                if (!guias.Any(guia => guia.NumeroGuia.Equals(entity.NumeroGuia)))
                {
                    try
                    {
                        Command.Connection.Open();

                        Command.CommandText = string.Format(
                            "INSERT INTO tbGuiaFaturamento (numeroGuia, idLoteGuia)" +
                            " VALUES ('{0}', {1});",
                            entity.NumeroGuia, entity.LoteGuia
                        );
                        Command.CommandType = CommandType.Text;

                        Command.ExecuteNonQuery();

                        return true;
                    }
                    catch (Exception e)
                    {
                        throw new Exception("Erro ao executar operação: " + e.Message);
                    }
                    finally
                    {
                        Command.Connection.Close();
                    }
                }
            }
            return false;
        }

        #endregion

        #region BlobGuia

        public BlobGuia BlobGuiaGetById(AuthenticationToken token, int id)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {

                try
                {
                    Command.Connection.Open();

                    Command.CommandText = "SELECT idBlobGuia, nomeBlob, containerBlob" +
                        " FROM tbBlobGuia WHERE idBlobGuia=" + id;
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    if (reader.Read())
                    {
                        BlobGuia guia = new BlobGuia()
                        {
                            ID = int.Parse(reader["idBlobGuia"].ToString()),
                            NomeBlob = reader["nomeBlob"].ToString(),
                            Container = reader["containerBlob"].ToString(),
                        };
                        return guia;
                    }
                    else
                    {
                        return null;
                    }
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        #endregion

        #region LoteGuia

        public IEnumerable<LoteGuia> LoteGuiaGetAllByTipoGuia(AuthenticationToken token,
            string registroANS, int prestador_id, TipoGuia tipo)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                try
                {
                    Command.Connection.Open();

                    Command.CommandText = string.Format(
                        "SELECT lg.idLoteGuia, lg.numeroLote, lg.idTipoGuia, lg.idOperadoraPrestador" +
                        " FROM tbLoteGuia as lg" +
                        " INNER JOIN tbOperadoraPrestador as op ON op.idOperadoraPrestador = lg.idOperadoraPrestador" +
                        " WHERE op.registroANS={0} AND op.idPrestador={1} AND lg.idTipoGuia={2}",
                        registroANS, prestador_id, (int)tipo
                    );
                    Command.CommandType = CommandType.Text;

                    var reader = Command.ExecuteReader();

                    List<LoteGuia> list = new List<LoteGuia>();
                    while (reader.Read())
                    {
                        LoteGuia lote = new LoteGuia()
                        {
                            ID = int.Parse(reader["idLoteGuia"].ToString()),
                            TipoGuia = (TipoGuia)int.Parse(reader["idTipoGuia"].ToString()),
                            NumeroLote = reader["numeroLote"].ToString(),
                            IDOperadoraPrestador = int.Parse(reader["idOperadoraPrestador"].ToString())
                        };
                        list.Add(lote);
                    }
                    return list;
                }
                catch (Exception e)
                {
                    throw new Exception("Erro ao executar operação: " + e.Message);
                }
                finally
                {
                    Command.Connection.Close();
                }
            }
        }

        #endregion

        #region TreeView

        public IEnumerable<TreeViewRoot> TreeViewGetAll(AuthenticationToken token)
        {
            var Command = InitializeCommand();
            if (!Validate(token))
            {
                throw new Exception("Erro: falha na autenticação.");
            }
            else
            {
                var login = LoginGetByToken(token);

                var operadoraPrestadorList = OperadoraPrestadorGetAll(token);
                var operadoraList = OperadoraGetAll(token);

                var query = from op in operadoraPrestadorList
                            join operadora in operadoraList on
                                op.RegistroANS equals operadora.RegistroANS
                            where op.IDPrestador == login.ID
                            select operadora;

                var rootList = new List<TreeViewRoot>();

                foreach (var operadora in query)
                {
                    var root = new TreeViewRoot();
                    root.RegistroANS = operadora.RegistroANS;
                    root.NomeOperadora = operadora.Nome;

                    var tipoGuiaList = new List<TreeViewTipoGuia>();

                    for (int tipoGuia = (int)TipoGuia.Consulta;
                            tipoGuia <= (int)TipoGuia.Solicitação_Odontologia; tipoGuia++)
                    {
                        var item = CriaTreeViewTipoGuia(token, operadora.RegistroANS, login.ID, (TipoGuia)tipoGuia, operadora);
                        
                        if (item != null)
                        {
                            item.RegistroANS = operadora.RegistroANS;
                            tipoGuiaList.Add(item);
                        }
                    }

                    root.ListaTipoGuias = tipoGuiaList;
                    rootList.Add(root);
                }

                return rootList;
            }
        }

        private TreeViewTipoGuia CriaTreeViewTipoGuia(AuthenticationToken token, string registroANS, int prestador_id, TipoGuia tipo, Operadora operadora)
        {
            TreeViewTipoGuia item = null;

            switch (tipo)
            {
                case TipoGuia.Consulta:
                case TipoGuia.SP_SADT:
                case TipoGuia.Resumo_Internação:
                case TipoGuia.Honorário_Individual:
                case TipoGuia.Odontologia:
                case TipoGuia.Consulta_Reapresentação:
                case TipoGuia.SP_SADT_Reapresentação:
                case TipoGuia.Resumo_Internação_Reapresentação:
                case TipoGuia.Honorário_Individual_Reapresentação:
                case TipoGuia.Odontologia_Reapresentação:
                    var loteGuiaList = new List<TreeViewNode>();

                    foreach (var lote in LoteGuiaGetAllByTipoGuia(token, registroANS, prestador_id, tipo))
                    {
                        var guiaFaturamentoList = new List<TreeViewNodeFaturamento>();

                        foreach (var guia in GuiaFaturamentoGetAllByLote(token, lote.ID))
                        {
                            guia.BlobGuiaInstance = BlobGuiaGetById(token, guia.BlobGuia);
                            
                            guiaFaturamentoList.Add(
                                new TreeViewNodeFaturamento()
                                {
                                    Guia = guia,
                                    Rotulo = guia.NumeroGuia,
                                    Tipo = tipo,
                                    RegistroANS = registroANS,
                                    Operadora = operadora
                                }
                            );
                        }

                        loteGuiaList.Add(
                            new TreeViewNodeLote()
                            {
                                Lote = lote,
                                Rotulo = lote.NumeroLote,
                                Tipo = tipo,
                                ListaGuiaFaturamento = guiaFaturamentoList,
                                RegistroANS = registroANS
                            }
                        );
                    }

                    item = new TreeViewTipoGuia()
                    {
                        TipoGuia = tipo,
                        ListaGuias = loteGuiaList
                    };
                    break;
                case TipoGuia.Solicitação_Internação:
                case TipoGuia.Solicitação_Prorrogação:
                case TipoGuia.Solicitação_SADT:
                case TipoGuia.Solicitação_Odontologia:
                    var guiaSolicitacaoList = new List<TreeViewNode>();

                    foreach (var guia in GuiaSolicitacaoGetAllByTipoGuia(token, registroANS, prestador_id, tipo))
                    {
                        guia.BlobGuiaInstance = BlobGuiaGetById(token, guia.BlobGuia);

                        guiaSolicitacaoList.Add(
                            new TreeViewNodeSolicitacao()
                            {
                                Guia = guia,
                                Rotulo = guia.NumeroGuia,
                                Tipo = tipo,
                                RegistroANS = registroANS,
                                Operadora = operadora
                            }
                        );
                    }

                    item = new TreeViewTipoGuia()
                    {
                        TipoGuia = tipo,
                        ListaGuias = guiaSolicitacaoList
                    };
                    break;
            }
            return item;
        }

        #endregion

        #region Azure

        /// <summary>
        /// Envia um arquivo para o blob do azure
        /// </summary>
        /// <param name="data">Array de bytes do arquivo</param>
        /// <param name="container">Nome do container no qual o arquivo sera salvo</param>
        /// <param name="fileName">Nome do arquivo no blob (somente minusculas e numeros)</param>
        /// <returns></returns>
        public bool PutBlob(byte[] data, string container, string fileName)
        {
            try
            {
                CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
                {
                    configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
                });

                // Get the storage account reference
                CloudStorageAccount objStorage = CloudStorageAccount.FromConfigurationSetting("BlobConnectionString");
                // get the Client reference using storage blobend point
                CloudBlobClient objClient = new CloudBlobClient(objStorage.BlobEndpoint, objStorage.Credentials);
                // Get Container reference
                CloudBlobContainer objContainer = objClient.GetContainerReference(container);
                // Get blob reference
                CloudBlob obj = objContainer.GetBlobReference(fileName);

                // Set meta values
                obj.Metadata["MetaName"] = "meta";
                // Open a stream using the cloud object
                BlobStream blobstream = obj.OpenWrite();
                // Write the stream to the blob database
                blobstream.Write(data, 0, data.Length);
                blobstream.Close();

                return true;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// Recupera um arquivo do sistema de blobs do azure
        /// </summary>
        /// <param name="fileName">Nome do arquivo no blob (somente minusculas e numeros)</param>
        /// <param name="container">Nome do container no qual o arquivo foi salvo</param>
        /// <returns></returns>
        public byte[] GetBlob(string fileName, string container)
        {
            try
            {

                CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
                {
                    configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
                });

                // Get the storage account reference
                CloudStorageAccount objStorage = CloudStorageAccount.FromConfigurationSetting("BlobConnectionString");
                // get the Client reference using storage blobend point
                CloudBlobClient objClient = new CloudBlobClient(objStorage.BlobEndpoint, objStorage.Credentials);
                // Get Container reference
                CloudBlobContainer objContainer = objClient.GetContainerReference(container);

                // Get the blob reference using the blob name provided in the search
                CloudBlob obj = objContainer.GetBlobReference(fileName);
                BlobStream blobstream = obj.OpenRead();

                MemoryStream s = new MemoryStream();
                blobstream.CopyTo(s);

                return s.ToArray();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        /// <summary>
        /// Remove um blob de um dos containers
        /// </summary>
        /// <param name="fileName">Nome do blob que sera removido</param>
        /// <param name="container">Nome do container na qual o blob se encontra</param>
        /// <returns></returns>
        public bool RemoveBlob(string fileName, string container)
        {
            try
            {
                CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
                {
                    configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
                });

                // Get the storage account reference
                CloudStorageAccount objStorage = CloudStorageAccount.FromConfigurationSetting("BlobConnectionString");
                // get the Client reference using storage blobend point
                CloudBlobClient objClient = new CloudBlobClient(objStorage.BlobEndpoint, objStorage.Credentials);
                // Get Container reference
                CloudBlobContainer objContainer = objClient.GetContainerReference(container);
                // Get blob reference
                CloudBlob obj = objContainer.GetBlobReference(fileName);

                obj.DeleteIfExists();

                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Retorna uma lista com todos os arquivos armazenados ate o momento em um determinado container
        /// </summary>
        /// <param name="container">Nome do container no qual sera recuperada a lista</param>
        /// <returns></returns>
        public IEnumerable<string> GetListBlobs(string container)
        {
            List<string> blobList = new List<string>();

            try
            {
                CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
                {
                    configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
                });

                // Get the storage account reference
                CloudStorageAccount objStorage = CloudStorageAccount.FromConfigurationSetting("BlobConnectionString");
                // get the Client reference using storage blobend point
                CloudBlobClient objClient = new CloudBlobClient(objStorage.BlobEndpoint, objStorage.Credentials);
                // Get Container reference
                CloudBlobContainer objContainer = objClient.GetContainerReference(container);

                IEnumerable<IListBlobItem> blobs = objContainer.ListBlobs();

                foreach (IListBlobItem item in blobs)
                {
                    blobList.Add(item.Uri.ToString());
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            return blobList;
        }

        /// <summary>
        /// Cria um container na estrutura do Azure 
        /// </summary>
        /// <param name="containerName">Nome do container</param>
        /// <returns></returns>
        public bool CreateContainer(string containerName)
        {
            try
            {
                CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
                {
                    configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
                });

                // Get the storage account reference
                CloudStorageAccount objStorage = CloudStorageAccount.FromConfigurationSetting("BlobConnectionString");
                // get the Client reference using storage blobend point
                CloudBlobClient objClient = new CloudBlobClient(objStorage.BlobEndpoint, objStorage.Credentials);
                // Get Container reference
                CloudBlobContainer objContainer = objClient.GetContainerReference(containerName);

                objContainer.CreateIfNotExist();

                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Remove um container
        /// </summary>
        /// <param name="containerName">Nome do container q sera removido</param>
        /// <returns></returns>
        public bool RemoveContainer(string containerName)
        {
            try
            {
                CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
                {
                    configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
                });

                // Get the storage account reference
                CloudStorageAccount objStorage = CloudStorageAccount.FromConfigurationSetting("BlobConnectionString");
                // get the Client reference using storage blobend point
                CloudBlobClient objClient = new CloudBlobClient(objStorage.BlobEndpoint, objStorage.Credentials);
                // Get Container reference
                CloudBlobContainer objContainer = objClient.GetContainerReference(containerName);

                objContainer.Delete();

                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Lista todos os containers
        /// </summary>
        /// <returns>Lista de strings com os nomes dos containers</returns>
        public IEnumerable<string> GetListContainers()
        {
            try
            {
                List<string> containers = new List<string>();

                CloudStorageAccount.SetConfigurationSettingPublisher((configName, configSetter) =>
                {
                    configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
                });

                // Get the storage account reference
                CloudStorageAccount objStorage = CloudStorageAccount.FromConfigurationSetting("BlobConnectionString");
                // get the Client reference using storage blobend point
                CloudBlobClient objClient = new CloudBlobClient(objStorage.BlobEndpoint, objStorage.Credentials);

                IEnumerable<CloudBlobContainer> IContainers = objClient.ListContainers();

                foreach (CloudBlobContainer item in IContainers)
                {
                    containers.Add(item.Name);
                }

                return containers;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion
    }
}
